package pubsub

import (
	"fmt"
	"sync"
	"time"
)

// chan<-表示此通道只能写    生产者
func produce(p chan<- int64, produceNum int) {
	for i := 0; i < produceNum; i++ {
		timeUnix := time.Now().UnixNano() //获取时间戳，单位毫秒
		temp := timeUnix + int64(i)
		p <- temp //将时间戳写入p
		fmt.Println("send:", temp)
	}
}

// <-chan表示此通道只能读   消费者
func consumer(c <-chan int64, id int, count int, wg *sync.WaitGroup) {
	for v := range c { //读取管道，直到关闭管道为止，没有值，那么阻塞
		fmt.Printf("消费者%d, receive: %d\n", id, v)
		count++
		wg.Done() //消费一次减1
	}
}

func RunProCon() {
	ch := make(chan int64) //创建channel，类型为int64
	var wg sync.WaitGroup  //线程控制
	var count = 0          //统计消费数量
	var produceNum = 10    //生产数量
	var idNum = 5          //消费者数量
	wg.Add(produceNum)     //数值设置为生产的数量

	for i := 1; i <= idNum; i++ {
		go consumer(ch, i, count, &wg) //调用消费者
	}
	go produce(ch, produceNum) //调用生产者

	wg.Wait()
	fmt.Println("消费了：", count) //输出消费数量
}
